home *** CD-ROM | disk | FTP | other *** search
/ Graphics & Sound Program…ng Techniques for the Mac / Graphics and Sound Programming Techniques for the Mac.iso / M&T Graphics & Sound Examples / Metrowerks Versions / C03 Sound Recording / P03 Sound Save / SoundSave.c next >
Encoding:
C/C++ Source or Header  |  1995-08-05  |  3.8 KB  |  175 lines  |  [TEXT/MMCC]

  1. //____________________________________________________________
  2. //    SoundSave.c
  3. //
  4. //    Copyright © Dan Parks Sydow, 1995
  5. //    From the book:
  6. //    "Graphics and Sound Programming Techniques for the Mac",
  7. //    M&T Books, 1995
  8.  
  9.  
  10. //____________________________________________________________
  11.  
  12. #include <Sound.h>
  13. #include <SoundInput.h>
  14.  
  15.  
  16. //____________________________________________________________
  17.  
  18. void     InitializeToolbox( void );
  19. Boolean  IsSoundInputAvailable( void );
  20. OSErr    RecordSoundToMemory( SndListHandle * );
  21. long     SaveSoundFromMemoryToResource( SndListHandle );
  22. OSErr    PlaySoundResourceSynch( short );
  23.  
  24.  
  25. //____________________________________________________________
  26.  
  27. #define    kHeapReserve              75 * 1024
  28. #define    kSndResIDMaxReserved      8191
  29.  
  30.  
  31. //____________________________________________________________
  32.  
  33. void  main( void )
  34. {
  35.    NumVersion     theSndMgrVers;
  36.    OSErr          theError;
  37.    SndListHandle  theSound;
  38.    long           theNewSoundID;
  39.    Boolean        soundInputPresent;   
  40.    
  41.    InitializeToolbox();
  42.    
  43.    MaxApplZone();
  44.  
  45.    theSndMgrVers = SndSoundManagerVersion();   
  46.    if ( theSndMgrVers.majorRev < 3 )
  47.       ExitToShell();
  48.  
  49.    soundInputPresent = IsSoundInputAvailable();
  50.    if ( soundInputPresent == false )
  51.       ExitToShell();
  52.       
  53.    theError = RecordSoundToMemory( &theSound );
  54.    if ( theError == userCanceledErr )
  55.       ExitToShell();
  56.  
  57.    theNewSoundID = SaveSoundFromMemoryToResource( theSound );
  58.  
  59.    ReleaseResource( (Handle)theSound );
  60.    theSound = nil;
  61.    
  62.    theError = PlaySoundResourceSynch( theNewSoundID );   
  63.    if ( theError != noErr )
  64.       ExitToShell();
  65. }
  66.  
  67.  
  68. //____________________________________________________________
  69.  
  70. OSErr  RecordSoundToMemory( SndListHandle *theSound )
  71. {
  72.    OSErr  theError;
  73.    Point  theCorner = { 50, 20 }; 
  74.    long   theTotalHeap;
  75.    long   theContigMem;
  76.    
  77.    PurgeSpace( &theTotalHeap, &theContigMem );
  78.  
  79.    *theSound = (SndListHandle)NewHandle( theContigMem - kHeapReserve );
  80.    
  81.    theError = SndRecord( nil, theCorner, siBestQuality, theSound );
  82.    
  83.    return ( theError );
  84. }
  85.  
  86.  
  87. //____________________________________________________________
  88.  
  89. long  SaveSoundFromMemoryToResource( SndListHandle theSound )
  90. {
  91.    long   theResID;
  92.    OSErr  theError;
  93.    short  theResourceFileRef;
  94.  
  95.    theResourceFileRef = CurResFile();
  96.    
  97.    do
  98.    {
  99.       theResID = UniqueID( 'snd ' );
  100.    } while ( theResID <= kSndResIDMaxReserved );
  101.  
  102.    AddResource( (Handle)theSound, 'snd ', theResID, "\pNew Sound" );
  103.    theError = ResError();
  104.    if ( theError != noErr )
  105.       ExitToShell();
  106.       
  107.    UpdateResFile( theResourceFileRef );
  108.    theError = ResError();
  109.    if ( theError != noErr )
  110.       ExitToShell();
  111.    
  112.    return ( theResID );
  113. }
  114.  
  115.  
  116. //____________________________________________________________
  117.  
  118. OSErr  PlaySoundResourceSynch( short theResID )
  119. {
  120.    Handle  theHandle;
  121.    OSErr   theError;
  122.    
  123.    theHandle = GetResource( 'snd ', theResID );
  124.    
  125.    if ( theHandle == nil )
  126.    {   
  127.       return ( resProblem );
  128.    }
  129.    else
  130.    {
  131.       HLock( theHandle );
  132.          theError = SndPlay( nil, (SndListHandle)theHandle, false );
  133.       HUnlock( theHandle );
  134.    
  135.       ReleaseResource( theHandle );
  136.  
  137.       return ( theError );
  138.    }
  139. }
  140.  
  141.  
  142. //____________________________________________________________
  143.  
  144. Boolean  IsSoundInputAvailable( void )
  145. {
  146.    OSErr    theError;
  147.    long     theResult;
  148.    Boolean  inputAvail;
  149.    
  150.    theError = Gestalt( gestaltSoundAttr, &theResult );
  151.    if ( theError != noErr )
  152.       ExitToShell();
  153.       
  154.    inputAvail = theResult & ( 1 << gestaltHasSoundInputDevice );  
  155.    if ( inputAvail > 0 )
  156.       return ( true );
  157.    else
  158.       return ( false );
  159. }
  160.  
  161.  
  162. //____________________________________________________________
  163.  
  164. void  InitializeToolbox( void )
  165. {
  166.    InitGraf( &qd.thePort );
  167.    InitFonts();
  168.    InitWindows();
  169.    InitMenus();
  170.    TEInit();
  171.    InitDialogs( 0L );
  172.    FlushEvents( everyEvent, 0 );
  173.    InitCursor();
  174. }
  175.